import pylab as pl
from data.Data import *
from KGA.Evolution import *
from initialization.Start import *
import utility.utility as UTL
import utility.graph as GR
import datetime


def EA_Clustering():

	### Inizializzazione parametri iniziali 
	#   e scansine del file di dati scelto
	Initialization = Start()

	### Carico i punti dal file
	Patterns = Initialization.getData()	

	### Grafico iniziale
	if (Initialization.grOn == "on"):
		pl.figure(num=None, figsize=(8, 8), dpi=80, facecolor='g', edgecolor='y')

	### Creo l'oggetto principale, che si occupa dell'intero processo di evoluzione
	E = Evolution(Initialization.max_it, Initialization.pop_size, Initialization.pcross, 
	Initialization.pmut, Patterns, Initialization.getNCentroids())

	if (Initialization.grOn == "on"):
		### Inizializzo il grafico dei pattern
		GR.initGraph(pl,Patterns,Initialization.nPattern)

		Chrom = E.getPopulation().getChromosomes()

		### Z contiene le coordinate del miglior individuo
		Z = []
		for i in range(Initialization.getNCentroids()):
			Z.append(Chrom[0].getCentroid(i))
			
		### Inizializza il grafico dei centri 
		#   sul grafico dei punti gia' esistente
		grCentri = GR.initCentersGraph(pl,Z,Initialization.getNCentroids())

	### ----------------------Ottimizzazione------------------------

	### Do il via alla ricerca della soluzione
	start = datetime.datetime.now()
	print "Inizio ottimizzazione ",str(start)
	
	if (Initialization.grOn == "on"):
		bestIndx, fitnessMaxAss , bestChrom = E.evolve(pl,grCentri,Initialization.grOn)
	else:
		bestIndx, fitnessMaxAss , bestChrom = E.evolve(None,None,Initialization.grOn)

	stop = datetime.datetime.now()
	print "Fine ottimizzazione ",str(stop)
	### -----------------------------------------------------------

	### Ricoloro i punti secondo la classificazione
	GR.colorDivision(Patterns, bestChrom ,Initialization.nPattern,Initialization.getNCentroids())

	### Risultati dell'ottimizzazione
	print "Miglior individuo: ",bestIndx 
	print "Coordinate miglior centroide: "
	for i in range(Initialization.getNCentroids()):
		print "centro ",i, bestChrom.getCentroid(i)

	### Se leukemia faccio i controli con le label vere  --------------------------------------

	if(Initialization.splitName[0] == "leukemia"):
		
		outFile = open("Leuk_risult.txt" , 'w')
		outFile.write("Verifica della corretta clusterizzazione"+'\n')
		outFile.write("del file: "+ Initialization.fileName +'\n')
		outFile.write("Inizio ottimizzazione " + str(start) + '\n')
		outFile.write("Fine ottimizzazione " + str(stop) + '\n')
		outFile.write("vero" + '\t' +"calcolato"+'\n')
		
		### Mi creo la matrice delle apparteneze 
		W = range(Initialization.nPattern)
				
		for i in range(Initialization.getNCentroids()):
			print "--"
			for k in range(len(bestChrom.p2c[i])):
				W[bestChrom.p2c[i][k]] = i

		for i in range(Initialization.nPattern):
			print Patterns[i]._real_label, '\t' , W[i]
			outFile.write(str(Patterns[i]._real_label) + '\t' + str(W[i]) +'\n')
			
		### Definisco l'associazione migliore per pattern/etichette
		assoc, errors_thisway, errors_theotherway = UTL.getBestAssociation(Patterns, W)
		for i in range(len(assoc)):
			print "Il pattern ", i, " e' associato all'etichetta ", assoc[i]

		print "Scegliendo questa associazione l'algoritmo classifica in modo incorretto ", errors_thisway, " pattern, con l'altra associazione commetterebbe ", errors_theotherway, " errori"
		
		confusion_matrix = UTL.getConfusionMatrix(Patterns, W, assoc)
		print "Matrice di confusione:"
		print confusion_matrix
		
		Rand_index = UTL.calculateRandIndex(Patterns, W)
		print "Rand index: ", Rand_index
		
		outFile.close()

	GR.plotResult(fitnessMaxAss)

	### Mantiene aperti i grafici
	pl.show()

def main():
	 
	EA_Clustering()
	
if __name__ == "__main__":
	main()
